package com.cius.eshop.utils;

import java.io.Serializable;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;

public class PageResult<T> implements Serializable {
	public static final int NUMBERS_PER_PAGE = 10;
	//一页显示的记录数
	private int numPerPage;
	//记录总数
	private int totalRows;
	//总页数
	private int totalPages;
	//当前页码
	private int currentPage;
	//起始行数
	private int startIndex;
	//结束行数
	private int lastIndex;
	//结果集存放List
	private List<T> resultList;
	private JdbcTemplate jdbcTemplate;

	/**
	 * 每页显示10条记录的构造函数,使用该函数必须先给Pagination设置currentPage，jTemplate初值
	 * @param sql oracle语句
	 */
	public PageResult(String sql){
		if(jdbcTemplate == null){
			throw new IllegalArgumentException("jTemplate is null,please initial it first. ");
		}else if(sql.equals("")){
			throw new IllegalArgumentException("sql is empty,please initial it first. ");
		}
		new PageResult<T>(sql,currentPage,NUMBERS_PER_PAGE,jdbcTemplate);
	}

	/**分页构造函数
	 * @param sql 根据传入的sql语句得到一些基本分页信息
	 * @param currentPage 当前页
	 * @param numPerPage 每页记录数
	 * @param jTemplate JdbcTemplate实例
	 */
	public PageResult(String sql,int currentPage,int numPerPage,JdbcTemplate jTemplate){
		if(jTemplate == null){
			throw new IllegalArgumentException("jdbcTemplate is null,please initial it first. ");
		}else if(sql == null || sql.equals("")){
			throw new IllegalArgumentException("sql is empty,please initial it first. ");
		}
		//设置每页显示记录数
		setNumPerPage(numPerPage);
		//设置要显示的页数
		setCurrentPage(currentPage);
		//计算总记录数
		StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");
		totalSQL.append(sql);
		totalSQL.append(" ) totalTable ");
		//给JdbcTemplate赋值
		this.jdbcTemplate = jTemplate;
		//总记录数
		setTotalRows(getJdbcTemplate().queryForObject(totalSQL.toString(),Integer.class));
		//计算总页数
		setTotalPages();
		//计算起始行数
		setStartIndex();
		//计算结束行数
		setLastIndex();

		//装入结果集
		setResultList(getJdbcTemplate().queryForList(getMySQLPageSQL(sql,startIndex,numPerPage)));
	}

	/**
	 * 构造MySQL数据分页SQL
	 * @param queryString
	 * @param startIndex
	 * @param pageSize
	 * @return
	 */
	public String getMySQLPageSQL(String queryString, Integer startIndex, Integer pageSize)
	{
		String result = "";
		if (null != startIndex && null != pageSize)
		{
			result = queryString + " limit " + startIndex + "," + pageSize;
		} else if (null != startIndex && null == pageSize)
		{
			result = queryString + " limit " + startIndex;
		} else
		{
			result = queryString;
		}
		return result;
	}



	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public int getNumPerPage() {
		return numPerPage;
	}

	public void setNumPerPage(int numPerPage) {
		this.numPerPage = numPerPage;
	}

	public List<T> getResultList() {
		return resultList;
	}

	public void setResultList(List resultList) {
		this.resultList = resultList;
	}

	public int getTotalPages() {
		return totalPages;
	}
	//计算总页数
	public void setTotalPages() {
		if(totalRows % numPerPage == 0){
			this.totalPages = totalRows / numPerPage;
		}else{
			this.totalPages = (totalRows / numPerPage) + 1;
		}
	}

	public int getTotalRows() {
		return totalRows;
	}

	public void setTotalRows(int totalRows) {
		this.totalRows = totalRows;
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setStartIndex() {
		this.startIndex = (currentPage - 1) * numPerPage;
	}

	public int getLastIndex() {
		return lastIndex;
	}

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	//计算结束时候的索引
	public void setLastIndex() {
		if( totalRows < numPerPage){
			this.lastIndex = totalRows;
		}else if((totalRows % numPerPage == 0) || (totalRows % numPerPage != 0 && currentPage < totalPages)){
			this.lastIndex = currentPage * numPerPage;
		}else if(totalRows % numPerPage != 0 && currentPage == totalPages){//最后一页
			this.lastIndex = totalRows ;
		}
	}

	@Override
	public String toString() {
		return "totalRows:"+totalRows+" totalPages:"+totalPages+" currentPage:"+currentPage+resultList;
	}
}


